<?php

namespace App\Manage;


use App\Models\Order;
use App\Models\SiteConfig;
use App\Service\Base\Manage;
use App\Service\WeChat\MiniPayV3;
use Illuminate\Support\Facades\Config;


class MiniPayLogicV3 extends Manage
{

    // 提现
    //   https://cloud.tencent.com/developer/article/2233513
    //   https://www.cnblogs.com/leaf-cq/p/14302927.html
    //   小程序 提现 v3 php


    // 小程序支付
    //   独立，不依赖于其他程序

    // 实例化 小程序支付v3
    protected function payV3()
    {
        // 查询 配置信息
        $config = Config::get('wx');
        if(empty($config['wx_mini_appid']) || empty($config['wx_mini_key']) || empty($config['wx_mchid']) || empty($config['serial_no']) || empty($config['pay_api3_key'])){
            return $this->_returnFail('请配置微信小程序信息！');
        }

        $payV3 = new MiniPayV3($config['wx_mini_appid'], $config['wx_mini_key'], $config['wx_mchid'], $config['serial_no'], $config['pay_api3_key']);

        return $payV3;
    }


    // 提现
    public function transfer($orderNo, $money, $openid)
    {
        $notify_url = $this->notifyUrl('withdraw');  // 回调

        // 判断支付金额
        //$money   = 0.01;
        //$orderNo = date("YmdHis").'A'.random(4);  // 新订单号 中间不能是下划线，只能是字母
        //$openid  = 'o4H167U1H0ASYznNJ1LDZgzw3jQg';
        $desc = '同意用户提现回款';

        // 实例化
        $payV3 = $this->payV3();
        if($payV3 === false){
            return false;
        }

        // 执行
        $result = $payV3->WechatTransfer($desc, $orderNo, $openid, $money, $notify_url);
        $result = json_decode($result, true);

        return $result;
    }


    // 退款 + 获取支付
    public function refundPay($orderNo, $money)
    {
        // 交易时间超过一年的订单无法提交退款（按支付成功时间+365天计算）
        $notify_url = $this->notifyUrl('refund');  // 回调

        // 订单时间
        // 退款用户状态
        if(empty($orderNo)){
            return $this->_returnFail('请传递退款订单编号！');
        }
        if(empty($money)){
            return $this->_returnFail('请传递支付金额！');
        }

        // 订单信息
        $orderInfo = (new Order())->isCache(true)->oneFind(['order_no' => $orderNo]);
        if(empty($orderInfo)){
            return $this->_returnFail('订单不存在！');
        }
        if($orderInfo['verify'] != 1){
            return $this->_returnFail('暂未通过审核，不能退款！');
        }

        // 退单金额错误
        $_money = $orderInfo['money'];
        if($_money != $money){
            return $this->_returnFail('支付金额错误！');
        }

        // 实例化
        $payV3 = $this->payV3();
        if($payV3 === false){
            return false;
        }

        // 制作 header
        $result = $payV3->refund($orderInfo['old_no'], $orderNo, $money, $notify_url);
        $result = json_decode($result, true);

        return $result;
    }


    #######################################################################################


    // 制作返回路径
    protected function notifyUrl($str)
    {
        $domain = request()->getHost();
        $url    = 'https://'.$domain.'/mobile/pay/'.$str.'-notify';

        return $url;
    }


    // 获取站点配置信息
    protected function getSiteConfig()
    {
        $siteConf = (new SiteConfig())->isCache(true)->getConfig();
        $siteConf = array_column($siteConf, 'value', 'field');

        return $siteConf;
    }

    // 抛出异常 主要是有锁表的事务中
    protected function throwIf($condition, $msg)
    {
        if($condition){
            throw new \Exception($msg);
        }
    }

}


